<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

require_once '/../Modele/PDO_Connecteur.php';

abstract class BaseModel {

    function __construct($id) {

        if ($id != null) {
            $db = PDO_Connecteur::getInstance();
            $elem = $db->getInformations($this->getTableName(), array('id' . get_class($this) => $id));
            if ($elem && $elem != null) {
                foreach ($elem[0] as $key => $value) {
                    if (isset($elem[0][$key])) {
                        $this->$key = $elem[0][$key];
                    }
                }
            }
        }
    }

    private static function convert($tab) {
        $res = array();
        foreach ($tab as $elem) {
            $obj = new static();
            foreach ($elem as $key => $value) {
                if (isset($elem[$key])) {
                    $obj->$key = $elem[$key];
                }
            }
            $res[] = $obj;
        }
        return $res;
    }

    public static function getById($id) {
        if ($id == null) {
            return null;
        }
        $db = PDO_Connecteur::getInstance();
        $res = static::getElement(array('id' . static::class => $id));
        if (!$res) {
            return false;
        }
        return $res[0];
    }

    public static function getElement($args) {
        $db = PDO_Connecteur::getInstance();
        if ($args == null) {
            $args = array();
        } else if (!is_array($args)) {
            return null;
        }
        $res = $db->getInformations(static::getTableName(), $args);
        if ($res && $res != null) {
            $res = static::convert($res);
        }
        return $res;
    }

    public static function getElementListeVote($args) {
        $db = PDO_Connecteur::getInstance();
        if ($args == null) {
            $args = array();
        } else if (!is_array($args)) {
            return null;
        }

        $res = $db->getInformations("liste_vote", $args);
        if ($res && $res != null) {
            $res = static::convert($res);
        }
        return $res;
    }

    public static function findall() {

        $db = PDO_Connecteur::getInstance();
        $res = $res = $db->getInformations(static::getTableName());
        if (!$res) {
            return false;
        }
        $res = static::convert($res);
        return $res;
    }

    /**
     * Ajoute l'élément courant dans la base de données en ne remplissant que les données spécifiées dans $args.
     * Si la variable est vide (null), la fonction ajoutera le maximum d'informations possibles dans la base de données.
     * 
     * @param type $args
     * @return boolean
     */
    public function addElement($args = null) {
        $db = PDO_Connecteur::getInstance();
        $className = strtolower(get_class($this));
        if ($args == null) {
            $args = get_object_vars($this);
        } else if (!is_array($args)) {
            return null;
        }
        $res = $db->insertInformations(static::getTableName(), $args);
        if (!$res) {
            return false;
        }
        return true;
    }

    public function addElementListeVote($args = null) {
        $db = PDO_Connecteur::getInstance();

        if ($args == null) {
            $args = get_object_vars($this);
        } else if (!is_array($args)) {
            return null;
        }

        $res = $db->insertInformations("liste_vote", $args);
        if (!$res) {
            return false;
        }
        return true;
    }

    public function updateElement($args, $id) {
        $db = PDO_Connecteur::getInstance();
        $className = strtolower(get_class($this));
        if ($args == null) {
            return false;
        }
        if (!is_array($args)) {
            return null;
        }

        $res = $db->updateInformations($className, $args, array('id' . get_class($this) => $id));
        if (!$res) {
            return false;
        }
        return true;
    }

    public function updateElementFiche($args, $id) {
        $db = PDO_Connecteur::getInstance();

        if ($args == null) {
            return false;
        }
        if (!is_array($args)) {
            return null;
        }

        $res = $db->updateInformations("fiche_personnage", $args, array('id' . get_class($this) => $id));
        if (!$res) {
            return false;
        }
        return true;
    }

    public function updateElementByLogin($args, $login) {
        $db = PDO_Connecteur::getInstance();
        $className = strtolower(get_class($this));
        if ($args == null || !is_array($args)) {
            return false;
        }
        $res = $db->updateInformations($className, $args, array('login' => $login));
        if (!$res) {
            return false;
        }
        return true;
    }

    public function deleteElement($id) {
        $db = PDO_Connecteur::getInstance();
        if ($id == null) {
            return false;
        }
        $res = $db->deleteInformations($this->getTableName(), array('id' . get_class($this) => $id));
        if (!$res) {
            return false;
        }
        return true;
    }

    private static function getTableName() {
        $tableName = preg_replace('/\B([A-Z])/', '_$1', static::class);
        return strtolower($tableName);
    }

    public static function getNbElement($args = null) {
        $db = PDO_Connecteur::getInstance();
        if ($args == null) {
            $args = array();
        } else if (!is_array($args)) {
            return null;
        }

        $res = $db->getNbLine(static::getTableName(), $args);
        return $res;
    }

}
